package com.demandbreakdown.xiyun.service;

import com.baomidou.mybatisplus.extension.service.IService;
import com.demandbreakdown.xiyun.model.dto.space.*;
import com.demandbreakdown.xiyun.model.entity.Space;
import com.demandbreakdown.xiyun.model.vo.space.MySpaceVO;
import com.demandbreakdown.xiyun.model.vo.space.SpaceInviteVO;
import com.demandbreakdown.xiyun.model.vo.space.SpaceUserListVO;
import com.demandbreakdown.xiyun.model.vo.space.SpaceVO;

/**
 * 空间服务接口
 *
 * @author poxz
 */
public interface SpaceService extends IService<Space> {

    /**
     * 创建空间
     *
     * @param userId         用户ID
     * @param spaceCreateDTO 空间创建参数
     * @return SpaceVO
     */
    SpaceVO createSpace(Long userId, SpaceCreateDTO spaceCreateDTO);

    /**
     * 获取我的空间列表
     *
     * @param userId 用户ID
     * @return MySpaceVO
     */
    MySpaceVO getMySpaces(Long userId);

    /**
     * 获取空间详情
     *
     * @param spaceId 空间ID
     * @param userId  用户ID
     * @return SpaceVO
     */
    SpaceVO getSpaceById(Long spaceId, Long userId);

    /**
     * 更新空间信息
     *
     * @param spaceId        空间ID
     * @param userId         用户ID
     * @param spaceUpdateDTO 空间更新参数
     * @return SpaceVO
     */
    SpaceVO updateSpace(Long spaceId, Long userId, SpaceUpdateDTO spaceUpdateDTO);

    /**
     * 升级空间等级
     *
     * @param spaceId         空间ID
     * @param userId          用户ID
     * @param spaceUpgradeDTO 空间升级参数
     * @return SpaceVO
     */
    SpaceVO upgradeSpace(Long spaceId, Long userId, SpaceUpgradeDTO spaceUpgradeDTO);

    /**
     * 生成邀请码
     *
     * @param spaceId 空间ID
     * @param userId  用户ID
     * @return SpaceInviteVO
     */
    SpaceInviteVO generateInviteCode(Long spaceId, Long userId);

    /**
     * 通过邀请码加入空间
     *
     * @param userId       用户ID
     * @param spaceJoinDTO 空间加入参数
     * @return SpaceVO
     */
    SpaceVO joinSpace(Long userId, SpaceJoinDTO spaceJoinDTO);

    /**
     * 获取空间成员列表
     *
     * @param spaceId 空间ID
     * @param userId  用户ID
     * @return SpaceUserListVO
     */
    SpaceUserListVO getSpaceMembers(Long spaceId, Long userId);

    /**
     * 修改成员角色
     *
     * @param spaceId       空间ID
     * @param currentUserId 当前用户ID
     * @param targetUserId  目标用户ID
     * @param roleUpdateDTO 角色更新参数
     */
    void updateMemberRole(Long spaceId, Long currentUserId, Long targetUserId, SpaceUserRoleUpdateDTO roleUpdateDTO);

    /**
     * 踢出成员
     *
     * @param spaceId       空间ID
     * @param currentUserId 当前用户ID
     * @param targetUserId  目标用户ID
     */
    void removeMember(Long spaceId, Long currentUserId, Long targetUserId);

    /**
     * 转让空间
     *
     * @param spaceId          空间ID
     * @param currentUserId    当前用户ID
     * @param spaceTransferDTO 空间转让参数
     */
    void transferSpace(Long spaceId, Long currentUserId, SpaceTransferDTO spaceTransferDTO);

    /**
     * 删除空间（级联删除相关数据）
     *
     * @param spaceId 空间ID
     * @param userId  用户ID
     */
    void deleteSpace(Long spaceId, Long userId);
}
